// 1.导入axios
import axios, { AxiosRequestHeaders } from "axios";

// 加载组件
// import { ElLoading } from 'element-plus'

// // 消息提示
// import { ElMessage } from 'element-plus'
import useStore1 from '@/store/store1'
const store1 = useStore1()
// 定义类型-泛型
interface IResponseData<T> {
    code: number,
    message: string,
    data: T
}

// any 任何类型
let loading:any
// 2.定义类
class Http {
    // 3.定义属性
    instance: any;
    // 4.类里面的构造器
    constructor(config: any) {
        // 创建实例
        this.instance = axios.create(config);

        // 添加请求拦截器
        this.instance.interceptors.request.use(function (config:any) {
            // 在发送请求之前做些什么

            //     loading = ElLoading.service({
            //     lock: true,
            //     text: 'Loading',
            //     background: 'rgba(0, 0, 0, 0.7)',
            // })

            if(store1.token && store1.token!=""){//如果需要传token,在请求头上加上token值
                (config.headers as AxiosRequestHeaders).token = store1.token;
// 判断store1.token是否为空，不为空即在请求头上把值带过去
            }

            return config;
        }, function (error:any) {
            // 对请求错误做些什么
            return Promise.reject(error);
        });

        // 添加响应拦截器
        this.instance.interceptors.response.use(function (response:any) {
            // 2xx 范围内的状态码都会触发该函数。
            // 对响应数据做点什么

            //loading.close()

            const {code,message,data} = response.data

            if(code == undefined){
                return response.data;
                // 如果没有约定的格式，那么你是什么，就返回什么
            }if(code === 0){
                return data
            }else if(code != 0){
                // ElMessage.error(message)
                return Promise.reject(message)
            }

            return response;
        }, function (error:any) {
            // 超出 2xx 范围的状态码都会触发该函数。
            // 对响应错误做点什么

            // ElMessage.error(error)

            return Promise.reject(error);
        });

    }
    get<T>(url: string, params?: object, data = {}): Promise<IResponseData<T>> {
        return this.instance.get(url, { params, ...data });
    }
    post<T>(url: string, params?: object, data = {}): Promise<IResponseData<T>> {
        return this.instance.post(url, params, data);
    }
    put<T>(url: string, params?: object, data = {}): Promise<IResponseData<T>> {
        return this.instance.put(url, params, data);
    }
    delete<T>(url: string, params?: object, data = {}): Promise<IResponseData<T>> {
        return this.instance.delete(url, { params, ...data });
    }
}
const config = {
    baseURL: '',
    timeout: 30 * 1000,
    withCredentials: true,
    // 证书
}

// 定义一个方法 test函数
const test = () => {

}
// 一个变量也可以导出,任何一个东西都可以导出
// const height = "1.8";
// const myhttp = new Http(config);
// export {myhttp,test,height};
// 使用多个对应的导入语句为 import {myhttp,height} from '@/http/index'

// const height1 = "1.8"
// const height2 = "1.9"
// export default new Http(config);
// export {height1,height2}

export default new Http(config);
// 导出

